package com.ittao.taoaicodeai.ai.tools;

import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONObject;
import com.ittao.taoaicodecommon.manage.storage.strategy.FileStorageStrategy;
import com.ittao.taoaicodecommon.manage.storage.strategy.impl.CosFileStorageStrategy;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolMemoryId;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;


/**
 * 文件写入工具
 * 支持 AI 通过工具调用的方式写入文件
 */
@Slf4j
@Component
public class FileWriteTool extends BaseTool {

    @Tool("写入文件到指定路径")
    public String writeFile(
            @P("文件的相对路径")
            String relativeFilePath,
            @P("要写入文件的内容")
            String content,
            @ToolMemoryId Object memoryId
    ) {
        if (relativeFilePath == null || relativeFilePath.trim().isEmpty()) {
            return "错误：文件路径不能为空";
        }

        if (content == null) {
            content = "";
        }

        try {
            // 使用基类的统一路径构建方法，从memoryId中解析appId和userId
            String fullFilePath = buildFullFilePathFromMemoryId(memoryId, relativeFilePath);

            // 解析memoryId获取appId用于对话历史判断
            MemoryIdParser parser = MemoryIdParser.parse(memoryId);
            Long appId = parser.getAppId();

            // 使用策略模式获取当前存储策略
            FileStorageStrategy storageStrategy = getCurrentStorageStrategy();

            // 写入文件（传递appId用于对话历史判断）
            if (storageStrategy instanceof CosFileStorageStrategy) {
                ((CosFileStorageStrategy) storageStrategy).writeFile(fullFilePath, content.getBytes(), appId);
            } else {
                storageStrategy.writeFile(fullFilePath, content.getBytes());
            }
            return "成功写入文件: " + relativeFilePath;

        } catch (Exception e) {
            String errorMessage = "写入文件失败: " + relativeFilePath + ", 错误: " + e.getMessage();
            log.error(errorMessage, e);
            return errorMessage;
        }
    }

    @Override
    public String getToolName() {
        return "writeFile";
    }

    @Override
    public String getDisplayName() {
        return "写入文件";
    }

    @Override
    public String generateToolExecutedResult(JSONObject arguments) {
        String relativeFilePath = arguments.getStr("relativeFilePath");
        String suffix = FileUtil.getSuffix(relativeFilePath);
        String content = arguments.getStr("content");

        // 生成简洁的工具执行结果
        String result = String.format("""
                **✏️ [工具调用]** %s %s
                
                ```%s
                %s
                ```
                """, getDisplayName(), relativeFilePath, suffix, content);

        // 输出前端和要持久化的内容
        return String.format("\n\n%s\n\n", result);
    }
}
